<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>JS var&let&const异同点</title>
</head>
<body>
  <p>var&let&const异同点</p>
  <ul>
    <li>相同点：三者都遵循“先声明后使用”原则, 函数内部优先查找内部是否声明，未声明可访问外部变量</li>
    <li>不同点1：var/let变量可单独声明，之后再某个时刻再赋值(且可多次赋值);const常量必须声明同时并赋值，且之后不可再次赋值(无法改变)</li>
    <li>不同点2：使用var定义的变量(或函数)没有块作用域概念，使用let/const定义的变量(或函数)是存在块作用域的</li>
    <li>不同点3：使用var定义的变量(或函数)可重复声明，在同一作用域内使用let/const定义的变量(或函数)是不能重复声明的</li>
    <li>注意点：const变量不能改变的深入理解，const变量不能改变其内存地址，其值不可改变(只限定于同一作用域内)，对于引用类型而言，内部成员仍然可改变</li>
    <li>推荐点：优先使用const来定义，如果变量值确实可能会发生变化，则考虑使用let(如for循环迭代值), 尽量不使用var来定义变量</li>
  </ul>
  <script src="const.js"></script>
  <script>
    // var user = 'Miracle';
    // let user = 'Miracle';
    const user = 'Miracle';
    function getName() {
      // var user = 'Miracle He';
      // let user = 'Miracle He';
      const user = 'Miracle He';
      console.log(user); // Miracle He
    }
    getName();
    console.log(user); // Miracle
    // 块作用域
    {
      var fullName = 'Miracle He';
      // let fullName = 'Miracle He';
    }
    console.log(fullName);
    // 是否重复声明
    var web = 'https://github.com/miracle-git'
    var web = 'https://www.baidu.com'
    let web = 'https://github.com/miracle-git'
    // let web = 'https://www.baidu.com' // 报错
  </script>
</body>
</html>